home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung 2 / Power-Programmierung CD 2 (Tewi)(1994).iso / c / library / dos / diverses / leda / incl / p_dictio.h < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-15  |  5.5 KB  |  164 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  2.1.1                                                 11-15-1991
  4. +
  5. +
  6. +  p_dictionary.h
  7. +
  8. +
  9. +  Copyright (c) 1991  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15.  
  16.  
  17. #ifndef P_DICTIONARY_H
  18. #define P_DICTIONARY_H
  19.  
  20. #include <LEDA/pers_tree.h>
  21.  
  22.  
  23. typedef NODE* p_dic_item;
  24.  
  25.  
  26. #define PERS_DIC(keytype,infotype) name3(keytype,infotype,PERS_DIC)
  27.  
  28. #define p_dictionary(keytype,infotype) name3(keytype,infotype,p_dictionary)
  29.  
  30. #define p_dictionarydeclare2(keytype,infotype)\
  31. \
  32. struct PERS_DIC(keytype,infotype): public pers_rb_tree{\
  33. \
  34. void copy_key(ent& x)         { Copy(*(keytype*)&x); }\
  35. void copy_inf(ent& x)         { Copy(*(infotype*)&x); }\
  36. void clear_key(ent& x)        { Clear(*(keytype*)&x); }\
  37. void clear_inf(ent& x)        { Clear(*(infotype*)&x); }\
  38. void print_key(ent& x)        { Print(*(keytype*)&x); }\
  39. int  cmp_keys(ent& x, ent& y) { return compare(*(keytype*)&x, *(keytype*)&y); }\
  40. \
  41. version V;\
  42. int count;\
  43. \
  44. public:\
  45. \
  46.  PERS_DIC(keytype,infotype)() { init_tree(); V = v_list->vl.first(); count=1;}\
  47.  PERS_DIC(keytype,infotype)(V_LIST* vl,version v) { v_list=vl; V=v; count=1;}\
  48.  void CLEAR() { if (--v_list->count==0) del_tree(); }\
  49. ~PERS_DIC(keytype,infotype)() { CLEAR(); }\
  50. \
  51. PERS_DIC(keytype,infotype)(PERS_DIC(keytype,infotype)& D)\
  52. { v_list = D.v_list; v_list->count++; V = D.V; count = D.count; }\
  53. \
  54. PERS_DIC(keytype,infotype)& operator=(PERS_DIC(keytype,infotype)& D)\
  55. { CLEAR(); v_list = D.v_list; v_list->count++; V = D.V; count = D.count;\
  56.   return *this; }\
  57. \
  58. keytype  key(NODE* p)  { return keytype(pers_rb_tree::key(p)); }\
  59. infotype inf(NODE* p)  { return infotype(pers_rb_tree::inf(p)); }\
  60. \
  61. NODE* locate(keytype k) { return pers_rb_tree::locate(Ent(k),V); }\
  62. NODE* locate_pred(keytype k) { return pers_rb_tree::locate_pred(Ent(k),V); }\
  63. NODE* lookup(keytype k) { return pers_rb_tree::lookup(Ent(k),V); }\
  64. \
  65. PERS_DIC(keytype,infotype)  insert(keytype k, infotype i)\
  66. { return PERS_DIC(keytype,infotype)(v_list,pers_rb_tree::insert(Ent(k),Ent(i),V)); }\
  67. \
  68. PERS_DIC(keytype,infotype)  del(keytype k)\
  69. { return PERS_DIC(keytype,infotype)(v_list,pers_rb_tree::del(Ent(k),V)); }\
  70. \
  71. PERS_DIC(keytype,infotype)  change_inf(NODE* p, infotype i)\
  72. { return PERS_DIC(keytype,infotype)(v_list,pers_rb_tree::change_inf(p,Ent(i),V)); }\
  73. \
  74. NODE* min()          { return pers_rb_tree::min(V); }\
  75. NODE* max()          { return pers_rb_tree::max(V); }\
  76. NODE* succ(NODE* p)  { return pers_rb_tree::succ(p,V); }\
  77. NODE* pred(NODE* p)  { return pers_rb_tree::pred(p,V); }\
  78. int   size()         { return pers_rb_tree::size(V); }\
  79. void  print()        { pers_rb_tree::print(V); }\
  80. void  draw(DRAW_NODE_FCT f, DRAW_EDGE_FCT g, double x0, double x1, double y, double dy)  { pers_rb_tree::draw(f,g,V,x0,x1,y,dy); }\
  81. double get_version() { return ver_num(V); }\
  82. \
  83. };\
  84. \
  85. class p_dictionary(keytype,infotype){\
  86. \
  87. PERS_DIC(keytype,infotype)* ptr;\
  88. \
  89. public:\
  90. \
  91. p_dictionary(keytype,infotype)()      { ptr = new PERS_DIC(keytype,infotype); }\
  92. p_dictionary(keytype,infotype)(int)   { ptr = new PERS_DIC(keytype,infotype); }\
  93. p_dictionary(keytype,infotype)(PERS_DIC(keytype,infotype)* p)\
  94. { ptr = (PERS_DIC(keytype,infotype)*)p; }\
  95. \
  96. p_dictionary(keytype,infotype)(ent p)\
  97. { ptr = (PERS_DIC(keytype,infotype)*)p; ptr->count++;}\
  98. \
  99. void clear() { if (--(ptr->count) == 0) delete ptr; }\
  100. \
  101. ~p_dictionary(keytype,infotype)()     { clear(); }\
  102. \
  103. \
  104. p_dictionary(keytype,infotype)(p_dictionary(keytype,infotype)& p)\
  105. { ptr = p.ptr; ptr->count++; }\
  106. \
  107. p_dictionary(keytype,infotype)& operator=(const p_dictionary(keytype,infotype)& p)\
  108. { p.ptr->count++;\
  109.   if (--ptr->count == 0)  delete ptr;\
  110.   ptr = p.ptr;\
  111.   return *this;\
  112. }\
  113. \
  114. keytype  key(NODE* p)     { return ptr->key(p); }\
  115. infotype inf(NODE* p)     { return ptr->inf(p); }\
  116. \
  117. NODE* locate(keytype k)      { return ptr->locate(k); }\
  118. NODE* locate_pred(keytype k) { return ptr->locate_pred(k); }\
  119. NODE* lookup(keytype k)      { return ptr->lookup(k); }\
  120. \
  121. p_dictionary(keytype,infotype) insert(keytype k, infotype i)\
  122. { return new PERS_DIC(keytype,infotype)(ptr->insert(k,i)); }\
  123. \
  124. p_dictionary(keytype,infotype) del(keytype k)\
  125. { return new PERS_DIC(keytype,infotype)(ptr->del(k)); }\
  126. \
  127. p_dictionary(keytype,infotype) change_inf(NODE* p, infotype i)\
  128. { return new PERS_DIC(keytype,infotype)(ptr->change_inf(p,i)); }\
  129. \
  130. int ref() { return ptr->count; }\
  131. \
  132. NODE* min()         { return ptr->min();     }\
  133. NODE* max()         { return ptr->max();     }\
  134. \
  135. NODE* succ(NODE* p)   { return ptr->succ(p);   }\
  136. NODE* succ(keytype k) { return locate(k); }\
  137. NODE* pred(NODE* p)   { return ptr->pred(p);   }\
  138. NODE* pred(keytype k) { return locate_pred(k); }\
  139. \
  140. NODE* first_item()       { return ptr->min();     }\
  141. NODE* next_item(NODE* p) { return ptr->succ(p);   }\
  142. \
  143. int   size()        { return ptr->size();    }\
  144. int   empty()       { return ptr->size()==0; }\
  145. \
  146. void  print()       { ptr->print(); }\
  147. void  draw(DRAW_NODE_FCT f, DRAW_EDGE_FCT g, double x0, double x1, double y, double dy)  { ptr->draw(f,g,x0,x1,y,dy); }\
  148. \
  149. friend ent  Copy(const p_dictionary(keytype,infotype)& D)\
  150. { D.ptr->count++; return ent(D.ptr); }\
  151. \
  152. friend ent  Ent(const p_dictionary(keytype,infotype)& D) { return D.ptr; }\
  153. \
  154. friend void Clear(p_dictionary(keytype,infotype)& D)     { D.clear(); }\
  155. \
  156. friend void Print(const p_dictionary(keytype,infotype)&, ostream& = cout) { }\
  157. \
  158. friend void Read(const p_dictionary(keytype,infotype)&, istream& = cin) { }\
  159. }; 
  160.  
  161.  
  162. #endif
  163.